home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 6 / CU Amiga Magazine's Super CD-ROM 06 (1996)(EMAP Images)(GB)(Track 1 of 4)[!][issue 1997-01].iso / cucd / prog / mui / muibuilder / mb / m2 / m2mui / mbmuiclasses.mod < prev    next >
Text File  |  1994-11-30  |  8KB  |  290 lines

  1. IMPLEMENTATION MODULE MuiClasses;
  2.  
  3. (*************************************************************************
  4. ** Structures and Macros for creating MUI custom classes.
  5. **
  6. ** converted for M2 by Christian 'Kochtopf' Scholz
  7. ||
  8. || some changes by Stefan Schulz / 20.09.94
  9. ||
  10. **
  11. **************************************************************************
  12. **
  13. ** $Id: MuiClasses.mod 1.3 1994/06/30 21:03:01 Kochtopf Exp $
  14. **
  15. **************************************************************************)
  16.  
  17. FROM    SYSTEM      IMPORT CAST, ADR, BYTE, ADDRESS, REG, SETREG;
  18. FROM    IntuitionD  IMPORT ObjectPtr, WindowPtr, ScreenPtr, DrawInfoPtr, IBox,
  19.                            IntuiMessagePtr, IClassPtr, IClass;
  20. FROM    GraphicsD   IMPORT TextFontPtr, RastPortPtr;
  21. FROM    ExecD       IMPORT MinNode;
  22. FROM    UtilityD    IMPORT Hook, HookPtr;
  23. IMPORT R;
  24. FROM    MuiD        IMPORT APTR;
  25.  
  26. (*
  27. ** first some general BOOPSI-things, which aren't defined in the normal defs.
  28. *)
  29.  
  30. TYPE    object = RECORD
  31.                     oNode   : MinNode;
  32.                     oClass  : IClassPtr;
  33.                  END;
  34.  
  35. (* get a pointer to our instance data *)
  36.  
  37. PROCEDURE InstData(cl : IClassPtr; obj : ObjectPtr) : ADDRESS;
  38.     BEGIN
  39.         RETURN (CAST(ADDRESS, obj) + ADDRESS(cl^.instOffset));
  40.     END InstData;
  41.  
  42. (* get the size ... *)
  43.  
  44. PROCEDURE InstSize(cl : IClassPtr) : CARDINAL;
  45.     BEGIN
  46.         RETURN cl^.instOffset+cl^.instSize+SIZE(object);
  47.     END InstSize;
  48.  
  49.  
  50. (* 
  51. ** something, which we can cast your object-pointer to
  52. ** (just used iternally)
  53. *)
  54.  
  55. TYPE    dummyXFC = RECORD
  56.                     mnd : mNotifyData;
  57.                     mad : mAreaData;
  58.                    END;
  59.  
  60.         dummyXFCPtr = POINTER TO dummyXFC;
  61.  
  62.  
  63. (*
  64. ** now the functions to get to some types of data of our object.
  65. *)
  66.  
  67.  
  68. PROCEDURE muiNotifyData(obj : APTR) : mNotifyDataPtr;
  69.     BEGIN
  70.         RETURN ADR(CAST(dummyXFCPtr, obj)^.mnd);
  71.     END muiNotifyData;
  72.  
  73. PROCEDURE muiAreaData(obj : APTR) : mAreaDataPtr;
  74.     BEGIN
  75.         RETURN ADR(CAST(dummyXFCPtr, obj)^.mad);
  76.     END muiAreaData;
  77.  
  78. PROCEDURE muiGlobalInfo(obj : APTR) : mGlobalInfoPtr;
  79.     BEGIN
  80.         RETURN CAST(dummyXFCPtr, obj)^.mnd.globalInfo;
  81.     END muiGlobalInfo;
  82.  
  83. PROCEDURE muiRenderInfo(obj : APTR) : mRenderInfoPtr;
  84.     BEGIN
  85.         RETURN CAST(dummyXFCPtr, obj)^.mad.renderInfo;
  86.     END muiRenderInfo;
  87.  
  88. PROCEDURE muiUserData(obj : APTR) : LONGINT;
  89.     BEGIN
  90.         RETURN CAST(dummyXFCPtr, obj)^.mnd.userData;
  91.     END muiUserData;
  92.  
  93.  
  94. (*
  95. ** here the macros from mui.h.
  96. ** use them to get e.g. your rastport.
  97. *)
  98.  
  99. PROCEDURE OBJ_app(obj : APTR) : ObjectPtr;
  100.     BEGIN
  101.         RETURN muiGlobalInfo(obj)^.applicationObject;
  102.     END OBJ_app;
  103.  
  104. PROCEDURE OBJ_win(obj : APTR) : ObjectPtr;
  105.     BEGIN
  106.         RETURN muiRenderInfo(obj)^.windowObject;
  107.     END OBJ_win;
  108.  
  109. PROCEDURE OBJ_dri(obj : APTR) : DrawInfoPtr;
  110.     BEGIN
  111.         RETURN muiRenderInfo(obj)^.drawInfo;
  112.     END OBJ_dri;
  113.  
  114. PROCEDURE OBJ_window(obj : APTR) : WindowPtr;
  115.     BEGIN
  116.         RETURN muiRenderInfo(obj)^.window;
  117.     END OBJ_window;
  118.  
  119. PROCEDURE OBJ_screen(obj : APTR) : ScreenPtr;
  120.     BEGIN
  121.         RETURN muiRenderInfo(obj)^.screen;
  122.     END OBJ_screen;
  123.  
  124. PROCEDURE OBJ_rp(obj : APTR) : RastPortPtr;
  125.     BEGIN
  126.         RETURN muiRenderInfo(obj)^.rastPort;
  127.     END OBJ_rp;
  128.  
  129. PROCEDURE OBJ_left(obj : APTR) : INTEGER;
  130.     BEGIN
  131.         RETURN muiAreaData(obj)^.box.left;
  132.     END OBJ_left;
  133.  
  134. PROCEDURE OBJ_top(obj : APTR) : INTEGER;
  135.     BEGIN
  136.         RETURN muiAreaData(obj)^.box.top;
  137.     END OBJ_top;
  138.  
  139. PROCEDURE OBJ_width(obj : APTR) : INTEGER;
  140.     BEGIN
  141.         RETURN muiAreaData(obj)^.box.width;
  142.     END OBJ_width;
  143.  
  144. PROCEDURE OBJ_height(obj : APTR) : INTEGER;
  145.     BEGIN
  146.         RETURN muiAreaData(obj)^.box.height;
  147.     END OBJ_height;
  148.  
  149. PROCEDURE OBJ_right(obj : APTR) : INTEGER;
  150.     BEGIN
  151.         RETURN OBJ_left(obj)+OBJ_width(obj)-1;
  152.     END OBJ_right;
  153.  
  154. PROCEDURE OBJ_bottom(obj : APTR) : INTEGER;
  155.     BEGIN
  156.         RETURN OBJ_top(obj)+OBJ_height(obj)-1;
  157.     END OBJ_bottom;
  158.  
  159. PROCEDURE OBJ_addleft(obj : APTR) : INTEGER;
  160.     BEGIN
  161.         RETURN INTEGER(muiAreaData(obj)^.addLeft);
  162.     END OBJ_addleft;
  163.  
  164. PROCEDURE OBJ_addtop(obj : APTR) : INTEGER;
  165.     BEGIN
  166.         RETURN INTEGER(muiAreaData(obj)^.addTop);
  167.     END OBJ_addtop;
  168.  
  169. PROCEDURE OBJ_subwidth(obj : APTR) : INTEGER;
  170.     BEGIN
  171.         RETURN INTEGER(muiAreaData(obj)^.subWidth);
  172.     END OBJ_subwidth;
  173.  
  174. PROCEDURE OBJ_subheight(obj : APTR) : INTEGER;
  175.     BEGIN
  176.         RETURN INTEGER(muiAreaData(obj)^.subHeight);
  177.     END OBJ_subheight;
  178.  
  179. PROCEDURE OBJ_mleft(obj : APTR) : INTEGER;
  180.     BEGIN
  181.         RETURN OBJ_left(obj)+OBJ_addleft(obj);
  182.     END OBJ_mleft;
  183.  
  184. PROCEDURE OBJ_mtop(obj : APTR) : INTEGER;
  185.     BEGIN
  186.         RETURN OBJ_top(obj)+OBJ_addtop(obj);
  187.     END OBJ_mtop;
  188.  
  189. PROCEDURE OBJ_mwidth(obj : APTR) : INTEGER;
  190.     BEGIN
  191.         RETURN OBJ_width(obj)-OBJ_subwidth(obj);
  192.     END OBJ_mwidth;
  193.  
  194. PROCEDURE OBJ_mheight(obj : APTR) : INTEGER;
  195.     BEGIN
  196.         RETURN OBJ_height(obj)-OBJ_subheight(obj);
  197.     END OBJ_mheight;
  198.  
  199. PROCEDURE OBJ_mright(obj : APTR) : INTEGER;
  200.     BEGIN
  201.         RETURN OBJ_mleft(obj)+OBJ_mwidth(obj)-1;
  202.     END OBJ_mright;
  203.  
  204. PROCEDURE OBJ_mbottom(obj : APTR) : INTEGER;
  205.     BEGIN
  206.         RETURN OBJ_mtop(obj)+OBJ_mheight(obj)-1;
  207.     END OBJ_mbottom;
  208.  
  209. PROCEDURE OBJ_font(obj : APTR) : TextFontPtr;
  210.     BEGIN
  211.         RETURN muiAreaData(obj)^.font;
  212.     END OBJ_font;
  213.  
  214. PROCEDURE OBJ_flags(obj : APTR) : MADFlagSet;
  215.     BEGIN
  216.         RETURN muiAreaData(obj)^.flags;
  217.     END OBJ_flags;
  218.  
  219.  
  220. (*
  221. ** here are some new procedures to generate dispatchers which restore A4
  222. *)
  223.  
  224. (* first the 'real' dispatcher *)
  225.  
  226. PROCEDURE DispatchEntry(class{R.A0} : HookPtr;
  227.                         object{R.A2}: ADDRESS;
  228.                         msg{R.A1}   : ADDRESS)     : ADDRESS;
  229.     (*$SaveA4:=TRUE*)
  230.     BEGIN
  231.         SETREG (R.A4, CAST(IClassPtr,class)^.dispatcher.data);
  232.         RETURN CAST(DispatcherDef,CAST(IClassPtr,class)^.dispatcher.subEntry)(CAST(IClassPtr,class), object, msg);
  233.     END DispatchEntry;
  234.  
  235. (* fill the dispatcher-record inside the class *)
  236.  
  237. PROCEDURE MakeDispatcher(entry:DispatcherDef; VAR myclass : IClassPtr);
  238.  
  239.     BEGIN
  240.             myclass^.dispatcher.node.succ  := NIL;
  241.             myclass^.dispatcher.node.pred  := NIL;
  242.             myclass^.dispatcher.entry      := DispatchEntry;
  243.             myclass^.dispatcher.subEntry   := CAST(ADDRESS,entry);
  244.             myclass^.dispatcher.data       := REG(R.A4);
  245.     END MakeDispatcher;
  246.  
  247.  
  248.  
  249. (* a useful PROCEDURE! *)
  250.  
  251. PROCEDURE FillMinMaxInfo (msg : mpAskMinMaxPtr; MinWidth   : CARDINAL;
  252.                                                 DefWidth   : CARDINAL;
  253.                                                 MaxWidth   : CARDINAL;
  254.                                                 MinHeight  : CARDINAL;
  255.                                                 DefHeight  : CARDINAL;
  256.                                                 MaxHeight  : CARDINAL);
  257.     BEGIN                                               
  258.  
  259.         msg^.MinMaxInfo^.MinWidth  := msg^.MinMaxInfo^.MinWidth +MinWidth;
  260.         msg^.MinMaxInfo^.DefWidth  := msg^.MinMaxInfo^.DefWidth +DefWidth;
  261.         msg^.MinMaxInfo^.MaxWidth  := msg^.MinMaxInfo^.MaxWidth +MaxWidth;
  262.  
  263.         msg^.MinMaxInfo^.MinHeight := msg^.MinMaxInfo^.MinHeight +MinHeight;
  264.         msg^.MinMaxInfo^.DefHeight := msg^.MinMaxInfo^.DefHeight +DefHeight;
  265.         msg^.MinMaxInfo^.MaxHeight := msg^.MinMaxInfo^.MaxHeight +MaxHeight;
  266.  
  267.     END FillMinMaxInfo;
  268.  
  269. (*
  270. ** 2 useful procedures for testing if some coordinates are inside your object
  271. ** (converted from the ones in class3.c. So look there how to use... )
  272. *)
  273.  
  274. PROCEDURE OBJ_between(a,x,b : INTEGER) : BOOLEAN;
  275.     BEGIN
  276.         RETURN ((x>=a) AND (x<=b));
  277.     END OBJ_between;
  278.  
  279. PROCEDURE OBJ_isInObject(x, y : INTEGER; obj : ObjectPtr) : BOOLEAN;
  280.     BEGIN
  281.         RETURN (OBJ_between(OBJ_mleft(obj), x, OBJ_mright(obj)) AND
  282.                 OBJ_between(OBJ_mtop(obj), y, OBJ_mbottom(obj)));
  283.     END OBJ_isInObject;
  284.  
  285.  
  286.  
  287.  
  288. END MuiClasses.
  289.  
  290.